﻿using System;
using System.Linq;
using System.Windows.Forms;
using WorkFlowBLL;
using Library;
using System.Drawing;
using Utils;
using System.Collections;

namespace QLCF.Forms
{
    public partial class frmUser : Form
    {
        private Boolean isLoading = true;
        private Boolean isChecked;
        private Boolean isAddData = false;
        private Boolean isPermission = false;                                        
        private Boolean Flag = false;        
        private Boolean isCheckChildNode = false;
        private Boolean isLoadTreeView;
        private int userID;

        public frmUser()
        {
            InitializeComponent();
            clsDataGridView.SetDataGridView(dataGridView1);
        }

        private void frmUser_Load(object sender, EventArgs e)
        {
            ReloadDataGridView();
            frmMain frmMain = new Forms.frmMain();
            LoadTreeView(frmMain.MainMenuStrip, this.trvMenu);
        }

        private void ReloadDataGridView()
        {
            CtrUser ctrUser = new CtrUser();
            var objUser = ctrUser.GetListUserLogin();
            if (objUser.Count > 0)
            {
                dataGridView1.AutoGenerateColumns = false;
                dataGridView1.DataSource = objUser;                
                clsControls.SetControls(this, false);                
                this.isLoading = false;
                dataGridView1.Select();
            }
        }        

        private void dataGridView1_RowEnter(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                if (this.isLoading) return;
                this.txtFullName.Text = dataGridView1.Rows[e.RowIndex].Cells["colsFullName"].Value.ToString();
                this.txtName.Text = dataGridView1.Rows[e.RowIndex].Cells["colsUserName"].Value.ToString();                
                CtrUser ctrUser = new CtrUser();                
                var objUser = ctrUser.UserGetInfoByName(this.txtName.Text);
                this.userID = objUser.UserID;               
                this.txtPass.Text = objUser.Password;
                this.txtPassRe.Text = objUser.Password;                
            }
            catch (Exception)
            {                
                throw;
            }
        }

        private void dataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
        {
            try
            {
                // Paint the row number on the row header.
                // The using statement automatically disposes the brush.
                SolidBrush b = new SolidBrush(dataGridView1.RowHeadersDefaultCellStyle.ForeColor);
                e.Graphics.DrawString((e.RowIndex + 1).ToString(System.Globalization.CultureInfo.CurrentUICulture), dataGridView1.DefaultCellStyle.Font,
                                        b, e.RowBounds.Location.X + 20, e.RowBounds.Location.Y + 4);
            }
            catch { }
        }

        private void btnAdd_Click(object sender, EventArgs e)
        {
            this.isAddData = true;
            this.isPermission = true;
            clsControls.SetControls(this, true);
            this.txtFullName.Focus();
            clsControls.ClearTextBox(this);            
        }

        private void btnEdit_Click(object sender, EventArgs e)
        {
            if (this.txtName.Text == "")
            {
                MessageBox.Show("Đề nghị chọn bản ghi cần sửa", "Thông báo...", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }
            this.isAddData = false;
            this.isPermission = true;
            clsControls.SetControls(this, true);
            this.txtFullName.Focus();
            this.txtName.Enabled = false;
        }

        private void btnDelete_Click(object sender, EventArgs e)
        {
            if (dataGridView1.RowCount == 0)
            {
                MessageBox.Show("Chưa chọn bản ghi cần xóa?", "Thông báo...", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }
            if (MessageBox.Show("Có đồng ý xoá bản ghi này không?", "Thông báo...", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) return;

            CtrUser ctrUser = new CtrUser();
            var objReturn = ctrUser.DeleteUserInfo(this.userID);
            if (objReturn > 0)
            {
                ReloadDataGridView();
                MessageBox.Show("Xóa người dùng thành công", "Thông báo...", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }
            else
            {
                MessageBox.Show("Có lỗi xảy ra khi thực hiện xóa tài khoản", "Thông báo...", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }
        }

        private void btnSave_Click(object sender, EventArgs e)
        {
            //Check đăng nhập

            if (this.txtFullName.Text.Trim() == "")
            {
                MessageBox.Show("Bạn chưa nhập tên đầy đủ!", "Thông báo...", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                txtFullName.Focus();
                return;
            }
            if (this.txtName.Text.Trim() == "")
            {
                MessageBox.Show("Bạn chưa nhập tên đăng nhập!", "Thông báo...", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                txtName.Focus();
                return;
            }
            if (this.txtPass.Text.Trim().Replace("'", "''") == "")
            {
                MessageBox.Show("Bạn chưa nhập mật khẩu!", "Thông báo...", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                txtPass.Focus();
                return;
            }
            if (this.txtPassRe.Text.Trim().Replace("'", "''") == "")
            {
                MessageBox.Show("Bạn chưa xác nhận mật khẩu!", "Thông báo...", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                txtPassRe.Focus();
                return;
            }

            if (this.txtPassRe.Text.Trim().Replace("'", "''") != this.txtPass.Text.Trim().Replace("'", "''"))
            {
                MessageBox.Show("Xác nhận mật khẩu không chính xác!", "Thông báo...", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                txtPassRe.Focus();
                return;
            }

            if (this.isAddData) // Thêm mới người dùng
            {
                CtrUser ctrUser = new CtrUser();
                var objCheck = ctrUser.CheckExistUserLogin(this.txtName.Text.Trim());
                if (objCheck)
                {
                    MessageBox.Show("Đã tồn tại tài khoản này!", "Thông báo...", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    return;
                }
                else
                {
                    var resultInsert = ctrUser.InsertUser(this.txtName.Text.Trim().Replace("'", "''"), Encryption.DeCode(this.txtPass.Text.Trim().Replace("'", "''")), this.txtFullName.Text.Replace("'", "''"));
                    if (resultInsert > 0)
                    {
                        MessageBox.Show("Thêm mới tài khoản thành công!", "Thông báo...", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                        ReloadDataGridView();
                        return;
                    }
                    else
                    {
                        MessageBox.Show("Có lỗi xảy ra khi thêm mới tài khoản!", "Thông báo...", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                        return;
                    }
                }
            }
            else // Cập nhật người dùng
            {
                CtrUser ctrUser = new CtrUser();
                var resultUser = ctrUser.UpdateUserInfoByName(this.txtName.Text.Trim().Replace("'", "''"), Encryption.EnCode(this.txtPass.Text.Trim().Replace("'", "''")), this.txtFullName.Text.Replace("'", "''"));                                
                if (resultUser > 0)
                {
                    ReloadDataGridView();
                    MessageBox.Show("Cập nhật tài khoản thành công!", "Thông báo...", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    return;
                }
                else
                {
                    MessageBox.Show("Có lỗi xảy ra khi cập nhật tài khoản!", "Thông báo...", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    return;
                }
            }
        }

        private void btnCancel_Click(object sender, EventArgs e)
        {
            this.isPermission = false;
            clsControls.SetControls(this, false);
        }

        private void btnClose_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void LoadTreeView(MenuStrip mnu, TreeView myTreeView)
        {
            TreeNode newNode;
            String strName, strText;
            this.trvMenu.ShowRootLines = false;
            this.trvMenu.Nodes.Clear();
            newNode = this.trvMenu.Nodes.Add("Menu", "Phân quyền", 0, 0);
            newNode.ForeColor = System.Drawing.Color.Blue;
            for (int i = 0; i < mnu.Items.Count - 2; i++)
            {
                TreeNode newNode1;
                if (mnu.Items[i].GetType().Name.ToLower() == "ToolStripSeparator".ToLower()) continue;
                strName = mnu.Items[i].Name;
                strText = mnu.Items[i].Text.Replace("&", "");
                newNode1 = newNode.Nodes.Add(strName, strText, 1, 2);
                LoadTreeView((ToolStripMenuItem)mnu.Items[i], newNode1);
            }
            this.trvMenu.ExpandAll();
            this.trvMenu.SelectedNode = this.trvMenu.Nodes[0];
        }

        private void LoadTreeView(ToolStripMenuItem mnu, TreeNode myParentTreeNode)
        {
            TreeNode newNode;
            String strName, strText;
            for (int i = 0; i < mnu.DropDownItems.Count; i++)
            {
                if (mnu.DropDownItems[i].GetType().Name.ToLower() == "ToolStripSeparator".ToLower()) continue;
                if (mnu.DropDownItems[i].Name == "mnuLogOff") continue;
                if (mnu.DropDownItems[i].Name == "mnuChangePW") continue;
                if (mnu.DropDownItems[i].Name == "mnuExit") continue;
                strName = mnu.DropDownItems[i].Name;
                strText = mnu.DropDownItems[i].Text.Replace("&", "");
                newNode = myParentTreeNode.Nodes.Add(strName, strText, 1, 2);
                LoadTreeView((ToolStripMenuItem)mnu.DropDownItems[i], newNode);
            }
        }

        //Duyet dang sach cac not bi check dua vao ArrayList
        private void ListNodeCheck(TreeNode trvNode, ArrayList ArrListNode)
        {
            if (trvNode.Nodes.Count == 0) return;
            foreach (TreeNode myNode in trvNode.Nodes)
            {
                if (myNode.Checked) ArrListNode.Add(myNode.Name);
                ListNodeCheck(myNode, ArrListNode);
            }
        }

        //Duyet danh sach cac ten cua Node trong Treeview dua vao ArrayList
        private void ListNode(TreeNode trvNode, ArrayList ArrListNode)
        {
            if (trvNode.Nodes.Count == 0) return;
            foreach (TreeNode myNode in trvNode.Nodes)
            {
                ArrListNode.Add(myNode);
                ListNode(myNode, ArrListNode);
            }
        }

        private void CheckParentNode(TreeNode myNode, Boolean blnValue)
        {
            myNode.Checked = blnValue;
            if (myNode.Level > 0)
                CheckParentNode(myNode.Parent, blnValue);
        }
        
        //Kiểm tra và thiết lập Check ParentNull
        private void CheckParentNodeNull(TreeNode myNode)
        {
            if (myNode.Level == 0) return;
            Boolean Temp = false;
            foreach (TreeNode myTreeView in myNode.Parent.Nodes)
                Temp = Temp || myTreeView.Checked;
            if (Temp == false)
            {
                myNode.Parent.Checked = false;
                CheckParentNodeNull(myNode.Parent);
            }
        }

        //Kiểm tra sau khi Check
        private void trvMenu_AfterCheck(object sender, TreeViewEventArgs e)
        {
            if (isLoading) return;
            if (this.isChecked != e.Node.Checked)
            {
                if (e.Node.Checked)
                    if (e.Node.Level == 0) e.Node.ImageIndex = 0;
                    else e.Node.ImageIndex = 2;
                else
                    if (e.Node.Level == 0) e.Node.ImageIndex = 0;
                    else e.Node.ImageIndex = 1;
            }
            if (this.isLoadTreeView) return;

            if (Flag)
            {
                Flag = false;
                return;
            }
            if ((isChecked != e.Node.Checked) && !isPermission)
            {
                Flag = true;
                e.Node.Checked = this.isChecked;
                return;
            }

            if (isCheckChildNode) return;
            foreach (TreeNode myTreeView in e.Node.Nodes)
                myTreeView.Checked = e.Node.Checked;

            isCheckChildNode = true;
            if (e.Node.Checked) CheckParentNode(e.Node, true);
            //Truong hop cac menu con deu trang
            CheckParentNodeNull(e.Node);
            this.isCheckChildNode = false;
        }

        //Kiểm tra trước khi Check
        private void trvMenu_BeforeCheck(object sender, TreeViewCancelEventArgs e)
        {
            this.isChecked = e.Node.Checked;
        }

        //Trước khi thu lại Một Node
        private void trvMenu_BeforeCollapse(object sender, TreeViewCancelEventArgs e)
        {
            if (e.Node.Level == 0) e.Cancel = true;
        }        
    }
}
